Cortex-M3 的中断和异常

#Technomous

所有能打断正常执行流的事件都称为异常。日常沟通过程中,我们经常会混合使用术语"中断" 与 “异常”,这里强调的都是他们对主程序所体现出来的"中断"性质,与我们以前学单片机时所讲的概念是相同的。

Cortex-M3 在内核水平上搭载了一个异常响应系统,支持位数众多的系统异常外部中断(如下图所示)。其中,编号为 1-15 的对应系统异常,大于等于 16 的则全是外部中断。除了个别异常的优先级被定死外,其它异常的优先级都是可编程的。

位置 优先级 优先级类型 名称 说明 地址
- - - 保留 0x0000_0000
-3 固定 Reset 复位 0x0000_0004
-2 固定 NMI 不可屏蔽中断
RCC时钟安全系统(CSS)联接到NMI向量
0x0000_0008
-1 固定 硬件失效(HardFault) 所有类型的失效 0x0000_000C
0 可设置 存储管理(MemManage) 存储器管理 0x0000_0010
1 可设置 总线错误 预取指失败,存储器访问失败 0x0000_0014
2 可设置 错误应用(Bus Fault) 预取指失败,存储器访问失败 0x0000_0018
- - - 保留 0x0000_001C~0x0000_002B
3 可设置 SVCall 通过 SWI 指令的系统服务调用 0x0000_002C
4 可设置 调试监控(DebuggerMonitor) 调试监控器 0x0000_0030
- - - 保留 0x000_0034
5 可设置 PendSV 可挂起的系统服务 0x0000_0038
6 可设置 SysTick 系统滴答定时器 0x0000_003C
编号 类型 优先级 简介
16 IRQ #0 可编程 外中断#0
17 IRQ #1 可编程 外中断#1
... ... ... ...
255 IRQ #239 可编程 外中断#239

这里中断和异常的区别在于,那 240 个中断对 CM3 核来说都是"意外突发事件"——也就是说,该请求信号来自 CM3 内核的外面,来自各种片上外设和外扩的外设,对 CM3 来说是"异步"的;而异常则是因 CM3 内核的活动产生的——在执行指令或访问存储器时产生,因此对 CM3 来说是"同步"的。